#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128    // OLED display width, in pixels
#define SCREEN_HEIGHT 64    // OLED display height, in pixels
#define OLED_RESET    -1    // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32

//定义延迟时间
#define delaytime 500

// 自定义I2C引脚配置
#define SDA_PIN 5  // 将SDA重定向到GPIO5
#define SCL_PIN 22 // 保持SCL在默认的GPIO22
#define POT_PIN 34 // 电位器输出在GPIO31

// 定义摇杆引脚
const int joystickXPin = 33;  // 连接到ESP32的33号引脚（ADC1_CH6）
const int joystickYPin = 32;  // 连接到ESP32的32号引脚（ADC1_CH7）


//定义脚踏开关引脚
const int FOOT_SWITCH_PIN = 14;  // 连接脚踏开关的GPIO引脚

// 定义变量
int xValue = 0;  // X轴值
int yValue = 0;  // Y轴值


//OLED
TwoWire I2C_SCREEN = TwoWire(0); // 创建一个新的I2C实例
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &I2C_SCREEN, OLED_RESET);
//

void setup() {
  Serial.begin(115200);//设置波普率

//遥杆设置
  // 设置按钮引脚为输入模式，并且启用上拉电阻

  
  Serial.println("摇杆控制器已启动");

//油门设置
  pinMode(FOOT_SWITCH_PIN, INPUT_PULLUP);  // 设置引脚为上拉输入模式
  Serial.println("EKW-5A-B Foot Switch Reader initialized");

//OLED设置
  // 初始化自定义I2C引脚
  I2C_SCREEN.begin(SDA_PIN, SCL_PIN, 400000); // 400kHz I2C时钟速率
  
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

  display.display();
  delay(delaytime); // Pause for 0.5 seconds
  display.clearDisplay();
}

void loop() {
//油门读数
  int switchState = digitalRead(FOOT_SWITCH_PIN);
  int sign;
  
  if (switchState == LOW) {  // 低电平表示脚踏开关被按下
    Serial.println("Foot switch is PRESSED");
    sign=1;
  } else {
    Serial.println("Foot switch is RELEASED");
    sign=0;
  }
  
  delay(delaytime);  // 防抖处理和减少串口输出频率

//电位器读数
  int potValue = analogRead(POT_PIN);
  float voltage = (potValue * 3.3) / 4095.0;

  Serial.print("Raw Value: ");
  Serial.print(potValue);//模拟电位值
  Serial.print(" | Voltage: ");
  Serial.print(voltage);//实际点位值
  Serial.println(" V");
  delay(delaytime);

//遥感读数
  // 读取摇杆的X轴和Y轴值
  xValue = analogRead(joystickXPin);
  yValue = analogRead(joystickYPin);
  
  // 读取按钮值（按下时为LOW，未按下时为HIGH）

  
  // 映射模拟值范围（从0-4095到-100-100）
  int xMapped = map(xValue, 0, 4095, -100, 100);
  int yMapped = map(yValue, 0, 4095, -100, 100);
  
  // 输出摇杆值
  Serial.print("X: ");
  Serial.print(xMapped);
  Serial.print("\tY: ");
  Serial.print(yMapped);
  Serial.print("\t");
  

  
  // 延时500毫秒，避免数据更新过快
  delay(delaytime);
//OLED输出
  // 设置文本属性
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.cp437(true);

  // 显示当前时间戳
  display.print("Uptime: ");
  display.print(millis() / 1000);
  display.println("s");
  Serial.print(millis() / 1000);
  Serial.println("s");

  //显示踏板状态
  display.println(sign);

  // 显示电位器
  display.print("V:");
  display.println(voltage);

  //显示x,y的值
  display.print("x:");
  display.println(xMapped);
  display.print("y:");
  display.println(yMapped);
  
  // 绘制图形
  //display.drawRect(0, 32, 128, 32, SSD1306_WHITE);
  //display.setTextSize(2);
  //display.setCursor(10, 40);
  //display.print("OLED TEST");

  display.display();
  delay(delaytime);
  display.clearDisplay();
}